﻿#region Using

using Commons.Diagnostics;
using SapFramework.Application.Connections;
using SapFramework.Interface.Controls.Forms.Base;
using SapFramework.Interface.Controls.Menus;
using SapFramework.Interface.Controls.Menus.Base;
using SapFramework.Interface.Events;

#endregion

namespace SapFramework.Application
{
    /// <summary>
    /// Classe que apresenta todas as funcionaldiades para a criação de um Add-On para o SAP Business One.
    /// </summary>
    /// <remarks>
    /// Embora esta classe já ofereça as funcionalidades necessárias para trabalhar com a UI e DI APIs, 
    /// é aconselhavel que novos Add-Ons herdem dela e definam nesta nova classe suas constantes e variaveis globais.
    /// </remarks>
    public class AddOn
    {
        /// <summary>
        /// Construtor padrão
        /// </summary>
        /// <param name="aAddOnIdentifier">String de identificação do Add-On.<remarks>Pode ser vazio para testes.</remarks></param>
        /// <param name="aEventHandler">Objeto que gerência os eventos no sistema. Quando nulo, será utilizado o gerênciador de eventos padrão.</param>
        public AddOn( string aAddOnIdentifier, EventHandler aEventHandler = null )
        {
            Connection = new SboConnection( aAddOnIdentifier );

            Forms = new FormManager( this );
            Menus = new MenuManager( this );

            EventHandler = aEventHandler ?? new EventHandler( this );
        }

        /// <summary>
        /// Construtor especial.
        /// </summary>
        /// <param name="aSboConnection">Objeto de conexão com o SAP Business One. Deve possuir pelo menos uma conexão com a UI ou com a DI.</param>
        /// <param name="aEventHandler">Objeto que gerência os eventos no sistema. Quando nulo, será utilizado o gerênciador de eventos padrão.</param>
        public AddOn( SboConnection aSboConnection, EventHandler aEventHandler = null )
        {
            Contract.Requires.NotNull( () => aSboConnection );
            //Um dos objetos de conexão não vai poder ser nulo.
            //Em outras palavras, ou o programa é UI ou DI ou então UI e DI.
            if ( aSboConnection.Interface == null )
                Contract.Requires.NotNull( () => aSboConnection.Database );
            else if ( aSboConnection.Database == null )
                Contract.Requires.NotNull( () => aSboConnection.Interface );

            Connection = aSboConnection;

            if ( Connection.Interface != null )
            {
                Forms = new FormManager( this );
                Menus = new MenuManager( this );

                EventHandler = aEventHandler ?? new EventHandler( this );
            }
        }

        /// <summary>
        /// Conexão via DI e UI API com o SAP Business One.
        /// </summary>
        public SboConnection Connection { get; private set; }

        /// <summary>
        /// Mantém o contrle dos formulários que estão abertos.
        /// </summary>
        public FormManager Forms { get; private set; }

        /// <summary>
        /// Mantém o controle dos menus criados pelo Add-On.
        /// </summary>
        public MenuManager Menus { get; private set; }

        /// <summary>
        /// Registra e dispara todos os eventos que foram declarados no escopo do programa.
        /// </summary>
        internal EventHandler EventHandler { get; set; }
    }
}